/*
 * @Author: wwssaabb
 * @Date: 2021-12-11 09:33:08
 * @LastEditTime: 2021-12-11 15:03:19
 * @FilePath: \handwritten-code\algorithm\整数反转.js
 */

/* 
给你一个 32 位的有符号整数 x， 返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围[−231, 231− 1]， 就返回 0。
假设环境不允许存储 64 位整数（ 有符号或无符号）。

示例 1：
输入： x = 123
输出： 321

示例 2：
输入： x = -123
输出： - 321

示例 3：
输入： x = 120
输出： 21

示例 4：
输入： x = 0
输出： 0

来源： 力扣（ LeetCode）
链接： https: //leetcode-cn.com/problems/reverse-integer
*/

//双指针字符串处理
var reverse = function (x) {
  if (x === 0) return x
  //正负分开处理
  let res = x < 0 ? '-' : ''
  let str = (x < 0 ? x.toString().slice(1) : x.toString()).split('')
  //初始化双指针
  let l = 0,
    r = str.length - 1,
    temp
  while (l < r) {
    temp = str[l]
    str[l] = str[r]
    str[r] = temp
    l++
    r--
  }
  res = parseInt(res + str.join(''))
  return res < -(2 ** 31) || res > 2 ** 31 - 1 ? 0 : res
};

//双指针（不转字符串）
var reverse = function (x) {
  if (x === 0) return 0
  let max = 1,
    sign = x < 0 ? -1 : 1
  x = Math.abs(x)
  //获取最大位数
  while (x / max >= 10) {
    max *= 10
  }
  //初始化双指针，左边是最高位max，右边是最低位1
  let l = max,
    r = 1,
    res = 0
  //开始反转
  console.log(max)
  while (l >= r) {
    let n_l = parseInt(x % (l * 10) / l) //拿左边的值
    let n_r = parseInt(x / r % 10) //拿右边的值
    res += l === r ? n_r * l : n_r * l + n_l * r //如果指针相同只用加一边
    l /= 10
    r *= 10
  }
  return res * sign
}

var reverse = function (x) {
  let rev = 0
  while (x !== 0) {
    let unit = x % 10
    x = ~~(x / 10) //将浮点数向下取整
    rev = rev * 10 + unit
    if (rev < -(2 ** 31) || rev > 2 ** 31 - 1) return 0
  }
  return rev
}


console.log(reverse(1234))
console.log(reverse(-12345))
// console.log(reverse(12345))
// console.log(reverse(123))
// console.log(reverse(-123))
// console.log(reverse(120))
// console.log(reverse(-120))
console.log(reverse(0))
console.log(reverse(10))
console.log(reverse(5))